/* 
 * File:   OperationBinaire.cpp
 * Author: Gab'z
 * 
 * Created on 2 mai 2012, 17:18
 */
/*
 * + ADD ajoute Constante* à la pile
 * - SUB ajoute Constante* à la pile
 * * MUL ajoute Constante* à la pile
 * / DIV ajoute Constante* à la pile
 * POW ajoute Constante* à la pile
 * MOD ajoute Constante* à la pile
 * SWAP échange les 2 premiers éléments de la pile
 * 
 */
#include "OperateurBinaire.h"
#include "Expression.h"

OperateurBinaire::~OperateurBinaire() {
}

void OperateurBinaire::exec(Pile* pile) const throw (OperatorException) {
    if (pile->size() < 2) throw OperatorException("Pas assez d'arguments pour un opérateur binaire ("); // + pile->size() + ")");
    const Constante* c = 0;
    const Constante* c1 = pile->getConstante(1)->clone();
    const Constante* c2 = pile->getConstante(2)->clone();
    const Expression* exp1 = dynamic_cast<const Expression*> (c1);
    const Expression* exp2 = dynamic_cast<const Expression*> (c2);
    if (exp1 != 0 || exp2 != 0) {
        c = new Expression(c1->toString() + c2->toString());
    } else {
        try {
            c = apply(c1, c2);
        } catch (OperatorException e) {
            throw OperatorException(e.what());
        }
    }
    delete c1;
    delete c2;
    pile->pop();
    pile->pop();
    pile->push(c);
    delete c;
}